#include <string>
#include <unordered_map>
#include <iostream>

class ConfigManager {
public:
    static ConfigManager& getInstance() {
        static ConfigManager instance;
        return instance;
    }

    std::string getValue(const std::string& key) {
        return configMap_[key];
    }

    void loadConfig(const std::string& filePath) {
        // 模拟加载配置文件
        configMap_ = {
            {"database.url", "jdbc:mysql://localhost:3306"},
            {"log.level", "INFO"}
        };
    }

private:
    ConfigManager() = default;
    std::unordered_map<std::string, std::string> configMap_;
};

// 使用示例
// 2. 配置管理
// 场景：读取并缓存全局配置参数，避免重复加载。
// 特点：
// 延迟加载配置文件（首次调用loadConfig时初始化）。
// 全局共享配置数据。
int main() {
    ConfigManager::getInstance().loadConfig("config.ini");
    std::cout << "Database URL: " << ConfigManager::getInstance().getValue("database.url") << std::endl;
    return 0;
}

// 总结
// 场景	        单例优势	                        实现方式推荐
// 日志系统	    全局唯一输出，避免多实例冲突	    C++11 局部静态变量
// 配置管理	    统一配置存储，延迟加载	            饿汉式或懒汉式
// 连接池	    复用资源，控制并发连接数	        懒汉式 + 智能指针
// 线程池	    全局任务调度，资源复用	            C++11 局部静态变量
// 渲染引擎	    唯一硬件上下文，避免资源竞争	    饿汉式或懒汉式